/*
 * ILS.cpp
 *
 *  Created on: 22/06/2011
 *      Author: daniel
 */

#include "ILS.h"
#include "Operator.h"
#include "LS.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

/**
 *	Recibe una lista de nodos y construye una solucion
 *	utilizando Busqueda Local Iterada.
 *	@param: Un vector con todos los nodos.
 *	@return: Una solucion.
 */
Solution* ILS::Ils(Solution *is, int MaxIter, int stuck) {


	Solution *sAct = is;
	Solution *sOpt = LS::LocalSearchBI(sAct, 50000, 500);

	int k = 0; // No mejoras.
	int i = 0; // Numero de iteraciones.
	//srand(time(NULL));

	while (k < stuck && i < MaxIter) {

		sAct = Operator::perturbation(sOpt);
		sAct = LS::LocalSearchBI(sAct, 100000, 1000);

		//Criterio de Aceptacion mejor mejor.
		if (sOpt->cost > sAct->cost) {
			k = 0;
			delete sOpt;
			sOpt = sAct->clone();
		}
		delete sAct;
		k++;
		i++;
	}

	// Guarda el costo de la solucion inicial.
	sOpt->iniCost = is->cost;

	// Guarda el numero de iteraciones.
	if (i < k)
		sOpt->numIter = i;
	else
		sOpt->numIter = k;

	return sOpt;
}
